@file:Suppress("Filename")

package com.escodro.designsystem.theme

import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import com.escodro.designsystem.provider.ThemeProvider
import org.koin.compose.koinInject

val AlkaaLightColorScheme = lightColorScheme(
    primary = md_theme_light_primary,
    onPrimary = md_theme_light_onPrimary,
    primaryContainer = md_theme_light_primaryContainer,
    onPrimaryContainer = md_theme_light_onPrimaryContainer,
    secondary = md_theme_light_secondary,
    onSecondary = md_theme_light_onSecondary,
    secondaryContainer = md_theme_light_secondaryContainer,
    onSecondaryContainer = md_theme_light_onSecondaryContainer,
    tertiary = md_theme_light_tertiary,
    onTertiary = md_theme_light_onTertiary,
    tertiaryContainer = md_theme_light_tertiaryContainer,
    onTertiaryContainer = md_theme_light_onTertiaryContainer,
    error = md_theme_light_error,
    errorContainer = md_theme_light_errorContainer,
    onError = md_theme_light_onError,
    onErrorContainer = md_theme_light_onErrorContainer,
    background = md_theme_light_background,
    onBackground = md_theme_light_onBackground,
    surface = md_theme_light_surface,
    onSurface = md_theme_light_onSurface,
    surfaceVariant = md_theme_light_surfaceVariant,
    onSurfaceVariant = md_theme_light_onSurfaceVariant,
    outline = md_theme_light_outline,
    inverseOnSurface = md_theme_light_inverseOnSurface,
    inverseSurface = md_theme_light_inverseSurface,
)
val AlkaaDarkColorScheme = darkColorScheme(
    primary = md_theme_dark_primary,
    onPrimary = md_theme_dark_onPrimary,
    primaryContainer = md_theme_dark_primaryContainer,
    onPrimaryContainer = md_theme_dark_onPrimaryContainer,
    secondary = md_theme_dark_secondary,
    onSecondary = md_theme_dark_onSecondary,
    secondaryContainer = md_theme_dark_secondaryContainer,
    onSecondaryContainer = md_theme_dark_onSecondaryContainer,
    tertiary = md_theme_dark_tertiary,
    onTertiary = md_theme_dark_onTertiary,
    tertiaryContainer = md_theme_dark_tertiaryContainer,
    onTertiaryContainer = md_theme_dark_onTertiaryContainer,
    error = md_theme_dark_error,
    errorContainer = md_theme_dark_errorContainer,
    onError = md_theme_dark_onError,
    onErrorContainer = md_theme_dark_onErrorContainer,
    background = md_theme_dark_background,
    onBackground = md_theme_dark_onBackground,
    surface = md_theme_dark_surface,
    onSurface = md_theme_dark_onSurface,
    surfaceVariant = md_theme_dark_surfaceVariant,
    onSurfaceVariant = md_theme_dark_onSurfaceVariant,
    outline = md_theme_dark_outline,
    inverseOnSurface = md_theme_dark_inverseOnSurface,
    inverseSurface = md_theme_dark_inverseSurface,
)

/**
 * Alkaa main theme.
 *
 * @param isDarkTheme indicates if the application is in dark theme mode.
 * @param isDynamicColor determine if the Android 12+ dynamic color is enabled
 * @param content composable function
 */

@Composable
fun AlkaaTheme(
    isDarkTheme: Boolean = isSystemInDarkTheme(),
    isDynamicColor: Boolean = true,
    themeProvider: ThemeProvider = koinInject(),
    content: @Composable () -> Unit,
) {
    val dynamicColor = isDynamicColor && themeProvider.isDynamicColorSupported
    val colorScheme = when {
        dynamicColor && isDarkTheme -> themeProvider.dynamicDarkColorScheme
        dynamicColor && !isDarkTheme -> themeProvider.dynamicLightColorScheme
        isDarkTheme -> AlkaaDarkColorScheme
        else -> AlkaaLightColorScheme
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = AlkaaTypography,
        content = content,
    )
}

@Composable
fun AlkaaThemePreview(
    isDarkTheme: Boolean = false,
    content: @Composable () -> Unit,
) {
    val colorScheme = if (isDarkTheme) {
        AlkaaDarkColorScheme
    } else {
        AlkaaLightColorScheme
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = AlkaaTypography,
        content = content,
    )
}
